package org.finesys.chat.core.base.listener;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.finesys.ai.entity.AigcModel;
import org.finesys.chat.core.base.constants.EventTypeEnum;
import org.finesys.chat.core.base.events.AigcModelEvent;
import org.finesys.chat.core.base.events.ChatModelEvent;
import org.finesys.chat.core.base.factory.ChatModel;
import org.finesys.chat.core.base.factory.ChatModelFactory;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
@RequiredArgsConstructor
public class ChatModelListener {

    private final ChatModelFactory chatModelFactory;

    /**
     * 处理聊天模型事件。
     * 根据事件的类型，更新或注册相应的聊天客户端。
     *
     * @param event 聊天模型事件对象
     */
    @EventListener
    public void onChatModelEvent(ChatModelEvent event) {
        // 处理聊天模型更新事件
        log.info("ChatModelEvent received: {}", event);
        // 获取事件类型和聊天模型信息
        String type = event.getType();
        // 获取聊天模型对象，此处假定事件源即为聊天模型实例
        ChatModel chatModel = (ChatModel) event.getSource();
        // 根据事件类型执行相应操作
        EventTypeEnum eventType = EventTypeEnum.getByName(type);
        switch (eventType) {
            case ADD:
                chatModelFactory.registerChatClient(chatModel);
                break;
            case UPDATE:
                chatModelFactory.updateChatClient((ChatModel) event.getSource());
                break;
            case DELETE:
                chatModelFactory.unregisterChatClient(chatModel);
                break;
            default:
                // 处理其他事件类型，例如删除等
                log.warn("Unsupported EventType: {}", event);
        }
    }

    /**
     * 处理聊天模型事件。
     * 根据事件的类型，更新或注册相应的聊天客户端。
     *
     * @param event 聊天模型事件对象
     */
    @EventListener
    public void onAigcModelEvent(AigcModelEvent event) {
        // 处理聊天模型更新事件
        log.info("AigcModelEvent received: {}", event);
        // 获取事件类型和聊天模型信息
        String type = event.getType();
        // 获取聊天模型对象，此处假定事件源即为聊天模型实例
        AigcModel chatModel = (AigcModel) event.getSource();
        // 根据事件类型执行相应操作
        EventTypeEnum eventType = EventTypeEnum.getByName(type);
        switch (eventType) {
            case ADD:
            case UPDATE:
                chatModelFactory.addOrUpdate(chatModel);
                break;
            case DELETE:
                chatModelFactory.unregisterAigcModel(chatModel);
                break;
            default:
                // 处理其他事件类型，例如删除等
                log.warn("Unsupported EventType: {}", event);
        }
    }
}
